import CommandManager from '../../../utils/commandManager';

Page({
  data: {
    timer: {
      type: 1, // 默认每天
      action: 0, // 默认开启
      hour: 8,
      minute: 0,
      second: 0,
      dayMask: 0x7F, // 0x7F = 01111111 表示周一到周日
      endAction: 1, // 默认结束时关闭
      endHour: 18,
      endMinute: 0,
      endSecond: 0,
      enabled: true
    },
    isEdit: false, // 是否是编辑模式
    timerId: 0, // 编辑时的定时器ID
    showEndTime: false, // 是否显示结束时间设置
    dayNames: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
    dayChecked: [true, true, true, true, true, true, true], // 周几选择状态
    typeOptions: ['单次', '每天', '每周', '时间段'],
    actionOptions: ['开启', '关闭'],
    showActionSelect: true, // 是否显示动作选择
  },

  onLoad: function(options) {
    // 判断是否为编辑模式
    this.setData({
      isEdit: options.edit === 'true'
    });
    
    // 获取事件通道
    const eventChannel = this.getOpenerEventChannel();
    
    // 监听上一页面传递的数据
    if (this.data.isEdit) {
      eventChannel.on('editTimer', (data) => {
        if (data.timer && data.udpManager) {
          this.udpManager = data.udpManager;
          this.initEditData(data.timer);
          console.log('[添加定时] 编辑模式，已接收数据:', data.timer);
        }
      });
    } else {
      eventChannel.on('setUDPManager', (data) => {
        if (data.udpManager) {
          this.udpManager = data.udpManager;
          console.log('[添加定时] 已接收UDP管理器');
        }
      });
    }
  },
  
  // 初始化编辑数据
  initEditData(timer) {
    // 从传入的timer对象中提取数据
    const rawData = timer.rawData;
    const dayMask = rawData.dayMask || 0;
    
    // 更新选中的日期 - 调整位置映射
    // dayMask第0位表示周日，第1位表示周一，依此类推
    const dayChecked = [
      (dayMask & (1 << 1)) !== 0,  // 周一 - 第1位
      (dayMask & (1 << 2)) !== 0,  // 周二 - 第2位
      (dayMask & (1 << 3)) !== 0,  // 周三 - 第3位
      (dayMask & (1 << 4)) !== 0,  // 周四 - 第4位
      (dayMask & (1 << 5)) !== 0,  // 周五 - 第5位
      (dayMask & (1 << 6)) !== 0,  // 周六 - 第6位
      (dayMask & (1 << 0)) !== 0   // 周日 - 第0位
    ];
    
    // 设置数据
    this.setData({
      timer: rawData,
      timerId: timer.id,
      dayChecked,
      showEndTime: rawData.type === 3
    });
  },

  // 改变定时类型
  bindTypeChange: function(e) {
    const type = parseInt(e.detail.value);
    
    // 更新类型
    this.setData({
      'timer.type': type,
      // 时间段模式显示结束时间
      showEndTime: type === 3,
      // 时间段模式固定action为0(开启)
      'timer.action': type === 3 ? 0 : this.data.timer.action
    });
    
    // 如果是每周模式或时间段模式，更新日期选择显示
    if (type === 2 || type === 3) {
      this.updateDayMask();
    }
  },
  
  // 改变动作类型
  bindActionChange: function(e) {
    this.setData({
      'timer.action': parseInt(e.detail.value)
    });
  },
  
  // 选择时间
  bindTimeChange: function(e) {
    const time = e.detail.value.split(':');
    this.setData({
      'timer.hour': parseInt(time[0]),
      'timer.minute': parseInt(time[1])
    });
  },
  
  // 选择结束时间
  bindEndTimeChange: function(e) {
    const time = e.detail.value.split(':');
    this.setData({
      'timer.endHour': parseInt(time[0]),
      'timer.endMinute': parseInt(time[1])
    });
  },
  
  // 切换周几选择
  toggleDay: function(e) {
    const index = e.currentTarget.dataset.index;
    const dayChecked = [...this.data.dayChecked];
    dayChecked[index] = !dayChecked[index];
    
    this.setData({ dayChecked });
    this.updateDayMask();
  },
  
  // 更新周掩码
  updateDayMask: function() {
    let dayMask = 0;
    
    // 正确映射星期几到位掩码
    // 周一到周六分别对应位1-6，周日对应位0
    if (this.data.dayChecked[0]) dayMask |= (1 << 1); // 周一
    if (this.data.dayChecked[1]) dayMask |= (1 << 2); // 周二
    if (this.data.dayChecked[2]) dayMask |= (1 << 3); // 周三
    if (this.data.dayChecked[3]) dayMask |= (1 << 4); // 周四
    if (this.data.dayChecked[4]) dayMask |= (1 << 5); // 周五
    if (this.data.dayChecked[5]) dayMask |= (1 << 6); // 周六
    if (this.data.dayChecked[6]) dayMask |= (1 << 0); // 周日
    
    this.setData({
      'timer.dayMask': dayMask
    });
  },
  
  // 保存定时
  saveTimer: function() {
    const { timer, isEdit, timerId } = this.data;
    
    // 基本验证
    if ((timer.type === 2 || timer.type === 3) && timer.dayMask === 0) {
      wx.showToast({
        title: '请选择重复日期',
        icon: 'none'
      });
      return;
    }
    
    if (timer.type === 3) {
      // 时间段类型特殊处理
      if (timer.hour === timer.endHour && timer.minute === timer.endMinute) {
        wx.showToast({
          title: '开始时间与结束时间不能相同',
          icon: 'none'
        });
        return;
      }
      
      // 强制设置开启动作
      timer.action = 0;  // 时间段固定为"开启"动作
      timer.endAction = 1; // 结束固定为"关闭"动作
    }
    
    wx.showLoading({
      title: isEdit ? '正在更新...' : '正在保存...'
    });
    
    // 准备命令数据
    let commandData = { ...timer };
    
    // 如果是编辑模式，需要包含定时器ID
    if (isEdit) {
      commandData.timerId = timerId;
    }
    
    // 创建命令
    const commandType = isEdit ? 'UPDATE_TIMER' : 'ADD_TIMER';
    const frame = CommandManager.createCommand(commandType, commandData);
    
    if (!frame) {
      wx.hideLoading();
      wx.showToast({
        title: '创建命令失败',
        icon: 'none'
      });
      return;
    }
    
    // 发送命令
    if (!this.udpManager) {
      wx.hideLoading();
      wx.showToast({
        title: '设备未连接',
        icon: 'none'
      });
      return;
    }
    
    // 创建响应处理器
    const messageHandler = (data) => {
      const result = CommandManager.parseFrame(data);
      if (result && result.cmd === CommandManager.Commands[commandType].CMD) {
        wx.hideLoading();
        
        if ((isEdit && result.data.success) || (!isEdit && result.data.timerId > 0)) {
          wx.showToast({
            title: isEdit ? '更新成功' : '添加成功',
            icon: 'success'
          });
          
          // 延迟返回
          setTimeout(() => {
            wx.navigateBack();
          }, 1000);
        } else {
          wx.showToast({
            title: isEdit ? '更新失败' : '添加失败',
            icon: 'none'
          });
        }
        
        // 移除处理器
        this.udpManager.offMessage(messageHandler);
      }
    };
    
    // 注册消息处理器
    this.udpManager.onMessage(messageHandler);
    
    // 发送命令
    this.udpManager.send(frame)
      .then(() => {
        console.log('[定时] 命令已发送:', isEdit ? '更新' : '添加');
        
        // 设置超时
        setTimeout(() => {
          wx.hideLoading();
          this.udpManager.offMessage(messageHandler);
          wx.showToast({
            title: '操作超时',
            icon: 'none'
          });
        }, 2000);
      })
      .catch(err => {
        console.error('[定时] 发送失败:', err);
        wx.hideLoading();
        this.udpManager.offMessage(messageHandler);
        wx.showToast({
          title: isEdit ? '更新失败' : '添加失败',
          icon: 'none'
        });
      });
  },
  
  // 取消
  cancel: function() {
    wx.navigateBack();
  }
}) 